package com.shujia.moniqiefen.mrsx.put;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;

/*
    1. 先假设1000条数据，就是1000M,假设一条数据为1M，那么按照假设来说，每128条数据为一个block块,students.csv-->8个block块
    2. 在此刻使用java模拟MR流程的时候，将原本真实MR中执行128*1.1的逻辑产生map任务提前到了产生block块上传文件的这一步，最终map任务的数量也不会受到影响
 */
public class PutData {
    public static void main(String[] args) throws Exception {
        //创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("hadoop/data/students.csv"));

        //一个block块，对应一个文件，说明需要输出流 block0
        //创建一个索引表示是第几个block块
        int index = 0;
        //创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("hadoop/out/blocks/block" + index));

        //记录读取的行数
        int rowNumber = 0;
        //创建一个集合对象，保存读取到的数据
        ArrayList<String> list = new ArrayList<>();

        String line = null;
        while ((line = br.readLine()) != null) {
            //每读取一行，行数增加1
            rowNumber++;

            //向集合中添加一行数据
            list.add(line);

            //触发产生block块的条件是：当rowNumber条数为140条的时候
            if (rowNumber == 140) {
                //触发写block块操作
                for (int i = 128 * index; i < 128 * index + 128; i++) {
                    //因为是list集合，可以使用索引获取元素
                    String info = list.get(i);
                    if(i==128 * index + 127){
                        //写到一个block块中
                        bw.write(info);
                    }else {
                        //写到一个block块中
                        bw.write(info);
                        bw.newLine();
                    }
                    bw.flush();
                }

                rowNumber = 12;
                index++;
                bw = new BufferedWriter(new FileWriter("hadoop/out/blocks/block" + index));
            }
        }

        //集合中还有可能有剩下的数据没有被写入到block块中
        for (int i = list.size() - rowNumber; i < list.size(); i++) {
            //因为是list集合，可以使用索引获取元素
            String info = list.get(i);
            if(i==128 * index + 127){
                //写到一个block块中
                bw.write(info);
            }else {
                //写到一个block块中
                bw.write(info);
                bw.newLine();
            }
            bw.flush();
        }

        //释放资源
        br.close();
        bw.close();

        System.out.println("数据上传完毕，所有block块已经产生！共产生 "+(index+1)+" 个block块文件...");
    }
}
